﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using ApplicationGenerator.BusinessModule.Elements;
using ApplicationGenerator.BusinessModule.MetaElements;
using ApplicationGenerator.CommonModule;
using ApplicationGenerator.Versions.BusinessLogic;
using ApplicationGenerator.Versions.Forms;
using ApplicationGenerator.BusinessModule.Interfaces;

namespace ApplicationGenerator.Lists.Web
{
    /// <summary>
    /// Akcja pozwalająca na usunięcie wybranego elementu (wybranych elementów)
    /// </summary>
    [DefaultProperty("MetaModel")]
    [Serializable]
    public class ListActionDeleteElement : ListActionBase
    {
        #region Properties
        /// <summary>
        /// Meta model, którego typu będą usuwane elementy z listy
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Element do usunięcia")]
        [Description("Typ elementu, jaki jest wyświetlany na liście")]
        [TypeConverter(typeof(VersionConverter))]
        [Editor(typeof(VersionEditor), typeof(UITypeEditor))]
        [VersionType(VersionElement.Model)]
        public VersionInfo MetaModel
        {
            get;
            set;
        }
        #endregion

        #region Overrides
        /// <summary>
        /// Wykonuje akcję
        /// </summary>
        public override void ExecuteAction()
        {
            IList<int> selectedIds = ListControl.GetSelectedIds();
            if (selectedIds.Count == 0)
            {
                base.ListControl.AddErrorMessage("Nie zaznaczono żadnego elementu na liście");
                return;
            }

            IModelFacade facade = (new FacadeFactory()).CreateModelFacade();
            IModel element = null;

            foreach (var selectedId in selectedIds)
            {
                element = facade.LoadModel(MetaModel.Name, selectedId);
                if (element.ModelInstance == null)
                {
                    base.ListControl.AddErrorMessage(string.Format("Element {0} nie istnieje.", selectedId.ToString()));
                    return;
                }

                facade.DeleteModel(element);
            }

            ListControl.Page.Response.Redirect(ListControl.Page.Request.Url.PathAndQuery);
        }

        /// <summary>
        /// Waliduje encję
        /// </summary>
        /// <param name="errorList">Lista błędów</param>
        /// <returns>Czy encja jest poprawna ?</returns>
        public override bool IsValid(ErrorEntity errorList)
        {
            bool isValid = base.IsValid(errorList);
            if (MetaModel == null)
            {
                errorList.ErrorStrings.Add("Należy podać model, którego elementy będą usuwane");
                return false;
            }

            if (MetaModelManager.Instance.MetaModelCollection[MetaModel.Name] == null)
            {
                errorList.ErrorStrings.Add("Podany model nie istnieje");
                return false;
            }

            return isValid;

        }

        /// <summary>
        /// Zwraca nazwę akcji
        /// </summary>
        /// <returns>Nazwa akcji</returns>
        public override string ToString()
        {
            return "Akcja usuń";
        }

        #endregion
    }
}
